/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.aspera.vista;

import co.edu.senaclem.logica.AprendizLogicaLocal;
import co.edu.senaclem.logica.FichaLogicaLocal;
import co.edu.senaclem.logica.PersonalLogicaLocal;
import co.edu.senaclem.logica.UsuariosLogicaLocal;
import co.edu.senaclem.modelo.Aprendiz;
import co.edu.senaclem.modelo.FichaTitulacion;
import co.edu.senaclem.modelo.Personal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.inputtextarea.InputTextarea;
import org.primefaces.component.password.Password;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author DILOVE
 */
@ManagedBean(name = "aprendizVista")
@RequestScoped
public class AprendizVista {

    @EJB
    private AprendizLogicaLocal aprendizLogica;

    @EJB
    private FichaLogicaLocal fichaLogica;

    @EJB
    private PersonalLogicaLocal personalLogica;

    @EJB
    private UsuariosLogicaLocal usuariosLogica;

    private InputText txtIdentificacion;
    private InputText txtNombre;
    private InputText txtApellido;
    private InputText txtCorreo;
    private InputText txtTelefono;
    private InputText txtFicha;
    private InputText txtJornada;
    private InputTextarea txtPrograma;
    private Password passClave;
    private CommandButton btnRegistrar;
    private CommandButton btnModificar;
    private CommandButton btnEliminar;
    private CommandButton btnLimpiar;
    private Aprendiz selectedAprendiz;
    private List<Aprendiz> listaAprendices = null;

    public InputText getTxtTelefono() {
        return txtTelefono;
    }

    public void setTxtTelefono(InputText txtTelefono) {
        this.txtTelefono = txtTelefono;
    }

    public Password getPassClave() {
        return passClave;
    }

    public void setPassClave(Password passClave) {
        this.passClave = passClave;
    }

    public void onEliminacionConfirm(ActionEvent actionEvent) {
        borrar_action();
    }

    /**
     * @return the txtIdentificacion
     */
    public InputText getTxtIdentificacion() {
        return txtIdentificacion;
    }

    /**
     * @param txtIdentificacion the txtIdentificacion to set
     */
    public void setTxtIdentificacion(InputText txtIdentificacion) {
        this.txtIdentificacion = txtIdentificacion;
    }

    /**
     * @return the txtNombre
     */
    public InputText getTxtNombre() {
        return txtNombre;
    }

    /**
     * @param txtNombre the txtNombre to set
     */
    public void setTxtNombre(InputText txtNombre) {
        this.txtNombre = txtNombre;
    }

    /**
     * @return the btnRegistrar
     */
    public CommandButton getBtnRegistrar() {
        return btnRegistrar;
    }

    /**
     * @param btnRegistrar the btnRegistrar to set
     */
    public void setBtnRegistrar(CommandButton btnRegistrar) {
        this.btnRegistrar = btnRegistrar;
    }

    /**
     * @return the btnModificar
     */
    public CommandButton getBtnModificar() {
        return btnModificar;
    }

    /**
     * @param btnModificar the btnModificar to set
     */
    public void setBtnModificar(CommandButton btnModificar) {
        this.btnModificar = btnModificar;
    }

    /**
     * @return the btnEliminar
     */
    public CommandButton getBtnEliminar() {
        return btnEliminar;
    }

    /**
     * @param btnEliminar the btnEliminar to set
     */
    public void setBtnEliminar(CommandButton btnEliminar) {
        this.btnEliminar = btnEliminar;
    }

    /**
     * @return the btnLimpiar
     */
    public CommandButton getBtnLimpiar() {
        return btnLimpiar;
    }

    /**
     * @param btnLimpiar the btnLimpiar to set
     */
    public void setBtnLimpiar(CommandButton btnLimpiar) {
        this.btnLimpiar = btnLimpiar;
    }

    /**
     * @return the txtApellido
     */
    public InputText getTxtApellido() {
        return txtApellido;
    }

    /**
     * @param txtApellido the txtApellido to set
     */
    public void setTxtApellido(InputText txtApellido) {
        this.txtApellido = txtApellido;
    }

    /**
     * @return the txtCorreo
     */
    public InputText getTxtCorreo() {
        return txtCorreo;
    }

    /**
     * @param txtCorreo the txtCorreo to set
     */
    public void setTxtCorreo(InputText txtCorreo) {
        this.txtCorreo = txtCorreo;
    }

    /**
     * @return the selectedAprendiz
     */
    public Aprendiz getSelectedAprendiz() {
        return selectedAprendiz;
    }

    /**
     * @param selectedAprendiz the selectedAprendiz to set
     */
    public void setSelectedAprendiz(Aprendiz selectedAprendiz) {
        this.selectedAprendiz = selectedAprendiz;
    }

    /**
     * @return the listaAprendices
     */
    public List<Aprendiz> getListaAprendices() {
        if (listaAprendices == null) {
            try {
                //System.out.println("Va a consultar los aprendices");
                setListaAprendices(aprendizLogica.consultar());
            } catch (Exception ex) {
                Logger.getLogger(AprendizVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return listaAprendices;
    }

    /**
     * @return the aprendizLogica
     */
    public AprendizLogicaLocal getAprendizLogica() {
        return aprendizLogica;
    }

    /**
     * @param aprendizLogica the aprendizLogica to set
     */
    public void setAprendizLogica(AprendizLogicaLocal aprendizLogica) {
        this.aprendizLogica = aprendizLogica;
    }

    /**
     * @return the fichaLogica
     */
    public FichaLogicaLocal getFichaLogica() {
        return fichaLogica;
    }

    /**
     * @param fichaLogica the fichaLogica to set
     */
    public void setFichaLogica(FichaLogicaLocal fichaLogica) {
        this.fichaLogica = fichaLogica;
    }

    /**
     * @return the txtJornada
     */
    public InputText getTxtJornada() {
        return txtJornada;
    }

    /**
     * @param txtJornada the txtJornada to set
     */
    public void setTxtJornada(InputText txtJornada) {
        this.txtJornada = txtJornada;
    }

    /**
     * @return the txtPrograma
     */
    public InputTextarea getTxtPrograma() {
        return txtPrograma;
    }

    /**
     * @param txtPrograma the txtPrograma to set
     */
    public void setTxtPrograma(InputTextarea txtPrograma) {
        this.txtPrograma = txtPrograma;
    }

    /**
     * @return the txtFicha
     */
    public InputText getTxtFicha() {
        return txtFicha;
    }

    /**
     * @param txtFicha the txtFicha to set
     */
    public void setTxtFicha(InputText txtFicha) {
        this.txtFicha = txtFicha;
    }

    /**
     * @param listaAprendices the listaAprendices to set
     */
    public void setListaAprendices(List<Aprendiz> listaAprendices) {
        this.listaAprendices = listaAprendices;
    }

    public void registrar_action() {
        //System.out.println("Registrar Aprendiz");
        if (usuariosLogica.validarSesion()) {
            try {
                Aprendiz nuevoAprendiz = new Aprendiz();
                Long docAprendiz = Long.parseLong(txtIdentificacion.getValue().toString());
                Personal nuevoPersonal = new Personal();
                nuevoPersonal.setDocumento(docAprendiz);
                nuevoPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
                nuevoPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
                nuevoPersonal.setCorreo(txtCorreo.getValue().toString().toUpperCase());
                nuevoPersonal.setTelefono(txtTelefono.getValue().toString());
                if (!passClave.isDisabled()) {
                    nuevoPersonal.setClave(passClave.getValue().toString());
                }

                String existePersonal = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("existePersonal");
                if (existePersonal.equals("no")) {
                    personalLogica.insertar(nuevoPersonal);
                } else {
                    personalLogica.modificar(nuevoPersonal);    //por si el usuario cambia algún dato del personal
                }
                Integer ficha = Integer.parseInt(getTxtFicha().getValue().toString());
                FichaTitulacion fichaA = getFichaLogica().consultarPorId(ficha);

                nuevoAprendiz.setDocumento(nuevoPersonal);
                nuevoAprendiz.setFichaTitulacion(fichaA);

                aprendizLogica.registrar(nuevoAprendiz);

                limpiar_action();

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Aprendiz se Creó con Exito"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        setListaAprendices(null);

    }

    public void modificar_action() {
        //System.out.println("Modificar Aprendiz");
        if (usuariosLogica.validarSesion()) {
            try {
                Long docAprendiz = Long.parseLong(txtIdentificacion.getValue().toString());

                //Modificar       
                Aprendiz aprendiz = new Aprendiz();
                Personal miPersonal = new Personal();
                miPersonal.setDocumento(docAprendiz);
                miPersonal.setNombre(txtNombre.getValue().toString().toUpperCase());
                miPersonal.setApellido(txtApellido.getValue().toString().toUpperCase());
                miPersonal.setCorreo(txtCorreo.getValue().toString().toUpperCase());
                miPersonal.setTelefono(txtTelefono.getValue().toString());
                personalLogica.modificar(miPersonal);

                Integer ficha = Integer.parseInt(getTxtFicha().getValue().toString());
                FichaTitulacion fichaA = getFichaLogica().consultarPorId(ficha);

                aprendiz.setDocumento(miPersonal);
                aprendiz.setFichaTitulacion(fichaA);

                aprendizLogica.modificar(aprendiz);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Aprendiz se Modificó con Exito"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }

        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        setListaAprendices(null);
    }

    public void borrar_action() {
        //System.out.println("Borrar Aprendiz");
        if (usuariosLogica.validarSesion()) {
            try {
                Long docAprendiz = Long.parseLong(txtIdentificacion.getValue().toString());
                //Borrar
                Personal miPersonal = new Personal();
                miPersonal.setDocumento(docAprendiz);
                Aprendiz aprendiz = new Aprendiz();
                aprendiz.setDocumento(miPersonal);
                aprendizLogica.eliminar(aprendiz);

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mensaje: ", "El Aprendiz se Eliminó con Exito"));
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", e.getMessage()));
            }
            limpiar_action();
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        setListaAprendices(null);

    }

    public void limpiar_action() {
        //System.out.println("Limpiar registro");
        if (usuariosLogica.validarSesion()) {
            txtIdentificacion.setValue("");
            txtNombre.setValue("");
            txtApellido.setValue("");
            txtTelefono.setValue("");
            txtCorreo.setValue("");
            txtFicha.setValue("");
            txtJornada.setValue("");
            txtPrograma.setValue("");
            btnEliminar.setDisabled(true);
            btnModificar.setDisabled(true);
            btnRegistrar.setDisabled(false);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void txtIdentificacion_listener() {
        //System.out.println("Entro al listener del Aprendiz");
        if (usuariosLogica.validarSesion()) {
            Aprendiz apre = null;
            Personal entityPersonal = null;
            try {
                Long documentoAprendiz = Long.parseLong(txtIdentificacion.getValue().toString());
                entityPersonal = personalLogica.consultarPorId(documentoAprendiz);
                apre = aprendizLogica.consultarPorId(documentoAprendiz);
            } catch (Exception ex) {
                Logger.getLogger(AprendizVista.class.getName()).log(Level.SEVERE, null, ex);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error: ", "El Documento debe ser Númerico!"));
            }

            if (entityPersonal == null) //si la persona no existe
            {
                txtNombre.setValue("");
                txtApellido.setValue("");
                txtCorreo.setValue("");
                txtTelefono.setValue("");
                getTxtFicha().setValue("");
                txtJornada.setValue("");
                txtPrograma.setValue("");
                passClave.setDisabled(false);
                passClave.setValue("");

                btnRegistrar.setDisabled(false);
                btnEliminar.setDisabled(true);
                btnModificar.setDisabled(true);
                //estadoBoton="noModifica";
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "no");
            } else if (apre == null) //si la persona existe pero no como aprendiz
            {
                txtNombre.setValue(entityPersonal.getNombre());
                txtApellido.setValue(entityPersonal.getApellido());
                txtCorreo.setValue(entityPersonal.getCorreo());
                txtTelefono.setValue(entityPersonal.getTelefono());
                passClave.setValue(entityPersonal.getClave());
                passClave.setDisabled(true);

                btnModificar.setDisabled(true);
                btnEliminar.setDisabled(true);
                btnRegistrar.setDisabled(false);
                //el personal ya existe por tanto guarda el estado en una variable de sesion
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
            } else //si ya existe como aprendiz
            {
                txtIdentificacion.setValue(apre.getDocumento().getDocumento());
                txtNombre.setValue(apre.getDocumento().getNombre());
                txtApellido.setValue(apre.getDocumento().getApellido());
                txtCorreo.setValue(apre.getDocumento().getCorreo());
                txtTelefono.setValue(apre.getDocumento().getTelefono());
                getTxtFicha().setValue(apre.getFichaTitulacion().getFicha());
                txtJornada.setValue(apre.getFichaTitulacion().getJornada());
                txtPrograma.setValue(apre.getFichaTitulacion().getCodigoPrograma().getNombre());
                btnRegistrar.setDisabled(true);
                passClave.setDisabled(true);

                btnEliminar.setDisabled(false);
                btnModificar.setDisabled(false);
                btnRegistrar.setDisabled(true);
                FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("existePersonal", "si");
                //estadoBoton="siModifica";
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public void txtFicha_listener() {
        //System.out.println("Entro al listener de la Ficha");
        if (usuariosLogica.validarSesion()) {
            try {
                FichaTitulacion ft = null;
                Integer numeroFicha = Integer.parseInt(getTxtFicha().getValue().toString());
                ft = fichaLogica.consultarPorId(numeroFicha);
                if (ft == null) {
                    txtJornada.setValue("");
                    txtPrograma.setValue("");

                    if (btnModificar.isDisabled()) {
                        btnRegistrar.setDisabled(true);
                    }

                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Aviso: ", "La Ficha No Está Registrada!"));
                } else {
                    getTxtFicha().setValue(ft.getFicha());
                    txtJornada.setValue(ft.getJornada());
                    txtPrograma.setValue(ft.getCodigoPrograma().getNombre());

                    if (btnModificar.isDisabled()) {
                        btnRegistrar.setDisabled(false);
                        btnEliminar.setDisabled(true);
                    } else {
                        btnRegistrar.setDisabled(true);
                        btnEliminar.setDisabled(false);
                    }

                }
            } catch (Exception ex) {
                Logger.getLogger(AprendizVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public void onRowSelect(SelectEvent event) {
        //System.out.println("Selecciono el Aprendiz");
        if (usuariosLogica.validarSesion()) {
            Aprendiz apre = (Aprendiz) event.getObject();
            //System.out.println("Aprendiz Seleccionado" + apre.getDocumento().getNombre()); 
            txtIdentificacion.setValue(apre.getDocumento().getDocumento());
            txtNombre.setValue(apre.getDocumento().getNombre());
            txtApellido.setValue(apre.getDocumento().getApellido());
            txtCorreo.setValue(apre.getDocumento().getCorreo());
            txtTelefono.setValue(apre.getDocumento().getTelefono());
            getTxtFicha().setValue(apre.getFichaTitulacion().getFicha());
            txtJornada.setValue(apre.getFichaTitulacion().getJornada());
            txtPrograma.setValue(apre.getFichaTitulacion().getCodigoPrograma().getNombre());

            btnRegistrar.setDisabled(true);
            btnEliminar.setDisabled(false);
            btnModificar.setDisabled(false);
            passClave.setDisabled(true);
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("../SesionInvalida.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(CoordinadorVista.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void handleFileUpload(FileUploadEvent event) {
        //System.out.println("Evento File upload!!!");

        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String rutaDestino = (String) servletContext.getRealPath("/excel"); // Sustituye "/" por el directorio ej: "/upload"
         //System.out.println("Ruta Server: " + rutaDestino);

        try {
            copyFile(rutaDestino, event.getFile().getFileName(), event.getFile().getInputstream());
            Map resultado = aprendizLogica.importarAprendices(rutaDestino + "\\" + event.getFile().getFileName());

            List<String> mensajesErrores = (List<String>) resultado.get("Errores");
            List<String> mensajesInfo = (List<String>) resultado.get("Info");

            for (int i = 0; i < mensajesInfo.size(); i++) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Ok: ", mensajesInfo.get(i)));
            }

            for (int i = 0; i < mensajesErrores.size(); i++) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Errores: ", mensajesErrores.get(i)));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception ex) {
            Logger.getLogger(AprendizVista.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void copyFile(String rutaDestino, String fileName, InputStream in) {
        try {
            OutputStream out = new FileOutputStream(new File(rutaDestino + "\\" + fileName));
            //System.out.println("Ruta Archivo: " + rutaDestino + "\\" + fileName);
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();
            //System.out.println("New file created!");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

}
